vlwkaos' digital garden

Rust - CLI Output

  • println! -> stdout
  • eprintln! -> stderr

성능

터미널 출력은 느리다. 그렇기 때문에 println!같은걸 루프에서 호출하면 아무리 빠른 프로그램이라도 느려진다. 이걸 좀 빠르게 하기위한 방법은 다음이 있다:

터미널을 청소("flush")하는 쓰기 동작을 최소화하라.

println!은 호출될 때마다 flush동작을 한다. 새로운 줄에 출력하는 것이 일반적이기 때문이다. 이게 필요 없다면 stdoutBufWriter에서 처리하도록 변경한다.

#![allow(unused)]
fn main() {
    use std::io::{self, Write};
    
    let stdout = io::stdout(); // get the global stdout entity
    let mut handle = io::BufWriter::new(stdout); // optional: wrap that handle in a buffer
    writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
}

stdout을 lock시키고 writeln!을 이용하여 직접 출력한다. 이렇게 하면 시스템이 자동적으로 lock/unlock 하는 과정을 생략할 수 있다.

#![allow(unused)]
fn main() {
    use std::io::{self, Write};
    
    let stdout = io::stdout(); // get the global stdout entity
    let mut handle = stdout.lock(); // acquire a lock on it
    writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
}

progress bar

fn main() {
    let pb = indicatif::ProgressBar::new(100);
    for i in 0..100 {
        do_hard_work();
        pb.println(format!("[+] finished #{}", i));
        pb.inc(1);
    }
    pb.finish_with_message("done");
}
Rust - CLI Output